www.gusucode.com > 精通MATLAB最优化计算全书代码 程序源码 > 随书源码_精通MATLAB最优化计算/第8章 约束优化问题/minconPS.m

    function [x,minf] = minconPS(f,g,x0,delta,u,var,eps1,eps2)
if nargin == 7
    eps2 = 1.0e-6;
end
n = length(var);
y = x0;
bmainCon = 1;

while bmainCon 
    yf = Funval(f,var,y);
    yk_1 = y;
    for i=1:n
        tmpy = zeros(size(y));
        tmpy(i) = delta(i);
        tmpf = Funval(f, var,y+tmpy);
        
        for j=1:length(g)
            cong(j) = Funval(g(j), var,y+tmpy);
        end
        if tmpf < yf && min(cong) >= 0
            bcon = 1;
            while bcon
                tmpy(i) = 2*tmpy(i);
                tmpf_i = Funval(f, var,y+tmpy);

                for j=1:length(g)
                    cong_i(j) = Funval(g(j), var,y+tmpy);
                end
                if tmpf_i <yf && min(cong_i)>=0
                    y_res = y  + tmpy;
                else
                    bcon = 0;
                end
            end
        else
            tmpy(i) = delta(i);
            tmpf = Funval(f, var,y-tmpy);

            for j=1:length(g)
                cong(j) = Funval(g(j), var,y-tmpy);
            end
            if tmpf < yf && min(cong) >= 0
                bcon = 1;
                while bcon
                    tmpy(i) = 2*tmpy(i);
                    tmpf_i = Funval(f, var,y-tmpy);

                    for j=1:length(g)
                        cong_i(j) = Funval(g(j), var,y-tmpy);
                    end
                    if tmpf_i <yf && min(cong_i)>=0
                        y_res = y  - tmpy;
                    else
                        bcon = 0;
                    end
                end
            else
                y_res = y ;
                delta = delta/u;
            end         
        end
        y = y_res;
    end
    if norm(y - yk_1) <= eps2
        if max(abs(delta)) <= eps1
            x = y;
            bmainCon = 0;
        else
            delta = delta / u;
        end
    end
end

minf = Funval(f,var,x);